package A_java语言的新特性.b.lambda表达式;

import A_java语言的新特性.b.Functional接口.Functional;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * Created by zc on 2017/3/10.
 * Lambda表达式的使用
 */
public class LambdaDemo_2 {
    public static void main(String[] args) {
        /**
         * JDK8预定义了很多函数接口以免用户重复定义
         * 最典型的是下面三种
         */
        /**
         * Function接口:
         *  @FunctionalInterface
         *  public @interface Function<T, R> {
         *      R apply(T t)
         *  }
         * 这个接口代表一个函数，接受一个T类型的参数，并返回一个R类型的返回值
         */
        Function<Integer, String> function = s -> s + " _function";
        String apply = function.apply(1);
        System.out.println(apply);

        /**
         * Consumer接口：
         *  @FunctionalInterface
         *  public @interface Consumer<T> {
         *      void accept(T t);
         *  }
         *  这个接口接受一个T类型的参数，没有返回值
         */
        Consumer<String> consumer = i -> System.out.println(i.hashCode() + " _consumer");
        consumer.accept("a");

        /**
         * Predicate接口：
         *  @FunctionalInterface
         *  public @interface Predicate<T> {
         *      boolean test(T t);
         *  }
         *  这个接口经常用来判断某项条件是否满足，进行一定的筛选操作
         */
        Predicate<String> predicate = s -> "".equals(s);
        System.out.println(predicate.test("a"));
        System.out.println(predicate.test(""));

        /**
         * 自定义函数是接口并调用
         */
        Functional functional = (s) -> System.out.println(s + "3456789");
        functional.method("1");


        List<String> list = new ArrayList<>();
        list.add("qq");
        list.add("xx");
        list.add("ww");
        list.forEach(e -> System.out.println(e));
        list.forEach(System.out::println);

    }
}
